import axios from 'axios';
import { ElMessage } from 'element-plus';
import moment from 'moment';
import router from '../router';

// 标记是否正在处理token过期，避免重复操作
let isHandlingTokenExpiry = false;

/**
 * 验证token有效性
 * @returns 是否有效
 */
export async function validateToken(): Promise<boolean> {
  const token = localStorage.getItem('token');
  if (!token) return false;

  try {
    console.log(`[${moment().format('YYYY-MM-DD HH:mm:ss')}] [INFO] [token验证] 开始验证token有效性`);
    const response = await axios.post('/api/auth/validate', { token });
    if (response.data.valid) {
      console.log(`[${moment().format('YYYY-MM-DD HH:mm:ss')}] [INFO] [token验证] token有效`);
      return true;
    } else {
      console.log(`[${moment().format('YYYY-MM-DD HH:mm:ss')}] [WARN] [token验证] token无效`);
      handleTokenExpiry();
      return false;
    }
  } catch (error) {
    console.error(`[${moment().format('YYYY-MM-DD HH:mm:ss')}] [ERROR] [token验证] 验证失败:`, error);
    handleTokenExpiry();
    return false;
  }
}

/**
 * 统一处理token过期逻辑
 */
function handleTokenExpiry() {
  if (isHandlingTokenExpiry) return;
  isHandlingTokenExpiry = true;

  console.log(`[${moment().format('YYYY-MM-DD HH:mm:ss')}] [WARN] [token过期] 清除登录状态`);
  localStorage.removeItem('token');
  localStorage.removeItem('user');

  // 检查当前是否已经在登录页
  if (router.currentRoute.value.path !== '/login') {
    ElMessage.warning('登录状态已过期，请重新登录');
    router.push('/login');
  }

  // 延迟重置标志，避免短时间内重复触发
  setTimeout(() => {
    isHandlingTokenExpiry = false;
  }, 1000);
}

/**
 * 设置axios拦截器，处理token添加和过期
 */
export function setupAxiosInterceptors() {
  // 请求拦截器 - 添加token到请求头
  axios.interceptors.request.use(
    config => {
      const token = localStorage.getItem('token');
      if (token) {
        config.headers.Authorization = `Bearer ${token}`;
        console.log(`[${moment().format('YYYY-MM-DD HH:mm:ss')}] [DEBUG] [请求拦截] 已添加token到请求头`);
      }
      return config;
    },
    error => {
      console.error(`[${moment().format('YYYY-MM-DD HH:mm:ss')}] [ERROR] [请求拦截] 请求配置失败:`, error);
      return Promise.reject(error);
    }
  );

  // 响应拦截器 - 处理token过期
  axios.interceptors.response.use(
    response => {
      console.log(`[${moment().format('YYYY-MM-DD HH:mm:ss')}] [DEBUG] [响应拦截] 收到响应: ${response.status}`);
      return response;
    },
    async error => {
      // 处理401错误（token过期或无效）
      if (error.response?.status === 401) {
        console.log(`[${moment().format('YYYY-MM-DD HH:mm:ss')}] [WARN] [响应拦截] 收到401错误，处理token过期`);
        handleTokenExpiry();
      } else {
        console.error(`[${moment().format('YYYY-MM-DD HH:mm:ss')}] [ERROR] [响应拦截] 请求错误:`, error);
      }
      return Promise.reject(error);
    }
  );
}